/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAODocumentoSustentador;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.entidad.DocumentoSustentador;
import pe.com.cotelasa.scp.entidad.MovimientoCajaChica;
import pe.com.cotelasa.scp.entidad.MovimientoCuentaBancaria;

/**
 *
 * @author DESARROLLO01
 */
@Repository("daoDocumentoSustentador")
public class DAODocumentoSustentadorImpl extends DaoImpl<DocumentoSustentador, Integer> 
             implements IDAODocumentoSustentador, Serializable{

    @Override
    // Visualizacion del comprobante de gastos del movimiento (Documento Sustentador)
    public DocumentoSustentador verSustentoMovimiento(DocumentoSustentador docSustentador) throws DAOException {
        
        DocumentoSustentador documentoSustentador = new DocumentoSustentador();
        try {
            sessionFactory.getCurrentSession().flush();
            Criteria query = sessionFactory.getCurrentSession().createCriteria(DocumentoSustentador.class)
                    .add(Restrictions.eq("numDocumento", docSustentador.getNumDocumento()))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()));

            documentoSustentador = (DocumentoSustentador) query.uniqueResult();

        } catch (Exception e) {
            e.printStackTrace();
            throw new DAOException(e.getMessage(), e);
        }
        
        return documentoSustentador;
        
        
    }

    @Override
    public Collection<DocumentoSustentador> listarDocSustentadorMovimiento(MovimientoCajaChica movCajaChica) throws DAOException {
        
        List<DocumentoSustentador> listaDocSustentador = new ArrayList<DocumentoSustentador>();
        try {
            sessionFactory.getCurrentSession().flush();
            listaDocSustentador = sessionFactory.getCurrentSession().createCriteria(DocumentoSustentador.class)
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("idMovimientoCajaChica", movCajaChica))
                    .list();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return listaDocSustentador;
        
    }
    
    
    @Override
    public Collection<DocumentoSustentador> listarDocSustentadorPorCuenta(MovimientoCuentaBancaria mocCuenta) throws DAOException {
        
        List<DocumentoSustentador> listaDocSustentador = new ArrayList<DocumentoSustentador>();
        try {
            sessionFactory.getCurrentSession().flush();
            listaDocSustentador = sessionFactory.getCurrentSession().createCriteria(DocumentoSustentador.class)
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("idMovimientoCuentaBancaria", mocCuenta))
                    .list();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return listaDocSustentador;
        
    }

    @Override
    public Collection<DocumentoSustentador> listarDocumentoPorFiltro(DocumentoSustentador documentoSustentador, Date fechaInicio, Date fechaFinal) throws DAOException {
        List<DocumentoSustentador> listaDocSustentador = new ArrayList<DocumentoSustentador>();
        try {
            sessionFactory.getCurrentSession().flush();
            Criteria query = sessionFactory.getCurrentSession().createCriteria(DocumentoSustentador.class)
                    .addOrder(Order.asc("fechaSustentacion"))
                    .createAlias("idMovimientoCajaChica", "mo")
                    .createAlias("mo.idCajaChica", "ca")
                    .createAlias("ca.idSede", "se")
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.isNotNull("idMovimientoCajaChica"));
            
            if (documentoSustentador.getIdMovimientoCajaChica().getIdCajaChica().getIdSede().getId() != null) {
                query = query.add(Restrictions.eq("se.id", documentoSustentador.getIdMovimientoCajaChica().getIdCajaChica().getIdSede().getId()));
            } else {
                query = query.add(Restrictions.eq("se.idEmpresa", documentoSustentador.getIdMovimientoCajaChica().getIdCajaChica().getIdSede().getIdEmpresa()));
            }
            
            if (documentoSustentador.getTipoDocumento()!= null) {
                query = query.add(Restrictions.like("tipoDocumento", "%"+documentoSustentador.getTipoDocumento()+"%"));
            }
            
            if (fechaInicio == null && fechaFinal == null) {
                listaDocSustentador = query.list();
            } else if (fechaInicio != null && fechaFinal != null) {
                listaDocSustentador = query.add(Restrictions.ge("fechaSustentacion", fechaInicio)).add(Restrictions.le("fechaSustentacion", fechaFinal)).list();
            } else if (fechaInicio == null) {
                listaDocSustentador = query.add(Restrictions.le("fechaSustentacion", fechaFinal)).list();
            } else if (fechaFinal == null) {
                listaDocSustentador = query.add(Restrictions.ge("fechaSustentacion", fechaInicio)).list();
            }
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return listaDocSustentador;
    }
    
    
    
}
